// import {validatenull} from './validate'


/**
 * 获取地址栏参数
 */

export const getUrlStr = (name)=>{
	let reg = new RegExp("(^|\\?|&)" + name + "=([^&]*)(\\s|&|$)","i");
	if(reg.test(window.location.href)){
		return unescape(RegExp.$2.replace(/\+/g," "))
	}
	return undefined
}

//表单序列化
export const serialize = data => {
    let list = [];
    Object.keys(data).forEach(ele => {
        list.push(`${ele}=${data[ele]}`)
    })
    return list.join('&');
};
export const getObjType = obj => {
    var toString = Object.prototype.toString;
    var map = {
        '[object Boolean]': 'boolean',
        '[object Number]': 'number',
        '[object String]': 'string',
        '[object Function]': 'function',
        '[object Array]': 'array',
        '[object Date]': 'date',
        '[object RegExp]': 'regExp',
        '[object Undefined]': 'undefined',
        '[object Null]': 'null',
        '[object Object]': 'object'
    };
    if (obj instanceof Element) {
        return 'element';
    }
    return map[toString.call(obj)];
};
export const getViewDom = () => {
    return window.document.getElementById('avue-view').getElementsByClassName('el-scrollbar__wrap')[0]
}
/**
 * 对象深拷贝
 */
export const deepClone = data => {
    var type = getObjType(data);
    var obj;
    if (type === 'array') {
        obj = [];
    } else if (type === 'object') {
        obj = {};
    } else {
        //不再具有下一层次
        return data;
    }
    if (type === 'array') {
        for (var i = 0, len = data.length; i < len; i++) {
            obj.push(deepClone(data[i]));
        }
    } else if (type === 'object') {
        for (var key in data) {
            obj[key] = deepClone(data[key]);
        }
    }
    return obj;
};
/**
 * 设置灰度模式
 */
export const toggleGrayMode = (status) => {
    if (status) {
        document.body.className = document.body.className + ' grayMode';
    } else {
        document.body.className = document.body.className.replace(' grayMode', '');
    }
};
/**
 * 设置主题
 */
export const setTheme = (name) => {
    document.body.className = name;
}

/**
 * 加密处理
 */
export const encryption = (params) => {
    let {
        data,
        type,
        param,
        key
    } = params;
    let result = JSON.parse(JSON.stringify(data));
    if (type == 'Base64') {
        param.forEach(ele => {
            result[ele] = btoa(result[ele]);
        })
    } else if (type == 'Aes') {
        param.forEach(ele => {
            result[ele] = window.CryptoJS.AES.encrypt(result[ele], key).toString();
        })

    }
    return result;
};


/**
 * 浏览器判断是否全屏
 */
export const fullscreenToggel = () => {
    if (fullscreenEnable()) {
        exitFullScreen();
    } else {
        reqFullScreen();
    }
};
/**
 * esc监听全屏
 */
export const listenfullscreen = (callback) => {
    function listen() {
        callback()
    }

    document.addEventListener("fullscreenchange", function () {
        listen();
    });
    document.addEventListener("mozfullscreenchange", function () {
        listen();
    });
    document.addEventListener("webkitfullscreenchange", function () {
        listen();
    });
    document.addEventListener("msfullscreenchange", function () {
        listen();
    });
};
/**
 * 浏览器判断是否全屏
 */
export const fullscreenEnable = () => {
    var isFullscreen = document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen
    return isFullscreen;
}

/**
 * 浏览器全屏
 */
export const reqFullScreen = () => {
    if (document.documentElement.requestFullScreen) {
        document.documentElement.requestFullScreen();
    } else if (document.documentElement.webkitRequestFullScreen) {
        document.documentElement.webkitRequestFullScreen();
    } else if (document.documentElement.mozRequestFullScreen) {
        document.documentElement.mozRequestFullScreen();
    }
};
/**
 * 浏览器退出全屏
 */
export const exitFullScreen = () => {
    if (document.documentElement.requestFullScreen) {
        document.exitFullScreen();
    } else if (document.documentElement.webkitRequestFullScreen) {
        document.webkitCancelFullScreen();
    } else if (document.documentElement.mozRequestFullScreen) {
        document.mozCancelFullScreen();
    }
};
/**
 * 递归寻找子类的父类
 */

export const findParent = (menu, id) => {
    for (let i = 0; i < menu.length; i++) {
        if (menu[i].children.length != 0) {
            for (let j = 0; j < menu[i].children.length; j++) {
                if (menu[i].children[j].id == id) {
                    return menu[i];
                } else {
                    if (menu[i].children[j].children.length != 0) {
                        return findParent(menu[i].children[j].children, id);
                    }
                }
            }
        }
    }
};
/**
 * 判断2个对象属性和值是否相等
 */

/**
 * 动态插入css
 */

export const loadStyle = url => {
    const link = document.createElement('link');
    link.type = 'text/css';
    link.rel = 'stylesheet';
    link.href = url;
    const head = document.getElementsByTagName('head')[0];
    head.appendChild(link);
};
/**
 * 判断路由是否相等
 */
export const diff = (obj1, obj2) => {
    delete obj1.close;
    var o1 = obj1 instanceof Object;
    var o2 = obj2 instanceof Object;
    if (!o1 || !o2) { /*  判断不是对象  */
        return obj1 === obj2;
    }

    if (Object.keys(obj1).length !== Object.keys(obj2).length) {
        return false;
        //Object.keys() 返回一个由对象的自身可枚举属性(key值)组成的数组,例如：数组返回下表：let arr = ["a", "b", "c"];console.log(Object.keys(arr))->0,1,2;
    }

    for (var attr in obj1) {
        var t1 = obj1[attr] instanceof Object;
        var t2 = obj2[attr] instanceof Object;
        if (t1 && t2) {
            return diff(obj1[attr], obj2[attr]);
        } else if (obj1[attr] !== obj2[attr]) {
            return false;
        }
    }
    return true;
}
/**
 * 根据字典的value显示label
 */
// export const findByvalue = (dic, value) => {
//     let result = '';
//     if (validatenull(dic)) return value;
//     if (typeof (value) == 'string' || typeof (value) == 'number' || typeof (value) == 'boolean') {
//         let index = 0;
//         index = findArray(dic, value);
//         if (index != -1) {
//             result = dic[index].label;
//         } else {
//             result = value;
//         }
//     } else if (value instanceof Array) {
//         result = [];
//         let index = 0;
//         value.forEach(ele => {
//             index = findArray(dic, ele);
//             if (index != -1) {
//                 result.push(dic[index].label);
//             } else {
//                 result.push(value);
//             }
//         });
//         result = result.toString();
//     }
//     return result;
// };
/**
 * 根据字典的value查找对应的index
 */
export const findArray = (dic, value) => {
    for (let i = 0; i < dic.length; i++) {
        if (dic[i].value == value) {
            return i;
        }
    }
    return -1;
};
/**
 * 生成随机len位数字
 */
export const randomLenNum = (len, date) => {
    let random = '';
    random = Math.ceil(Math.random() * 100000000000000).toString().substr(0, len ? len : 4);
    if (date) random = random + Date.now();
    return random;
};
/**
 * 打开小窗口
 */
export const openWindow = (url, title, w, h) => {
    // Fixes dual-screen position                            Most browsers       Firefox
    const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left
    const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top

    const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width
    const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height

    const left = ((width / 2) - (w / 2)) + dualScreenLeft
    const top = ((height / 2) - (h / 2)) + dualScreenTop
    const newWindow = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left)

    // Puts focus on the newWindow
    if (window.focus) {
        newWindow.focus()
    }
}


//常用工具类，注册到了vue属性中，直接使用this.U即可
export const U = {
    isObject: function (input) {
        return Object.prototype.toString.call(input) === '[object Object]';
    },
    isPlainObject: function (obj) {
        let prototype;
        return Object.prototype.toString.call(obj) === '[object Object]'
            && (prototype = Object.getPrototypeOf(obj), prototype === null ||
            prototype === Object.getPrototypeOf({}))
    },
    isArray: function (input) {
        return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
    },
    isDate: function (input) {
        return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
    },
    isNumber: function (input) {
        return input instanceof Number || Object.prototype.toString.call(input) === '[object Number]';
    },
    isString: function (input) {
        return input instanceof String || Object.prototype.toString.call(input) === '[object String]';
    },
    isBoolean: function (input) {
        return typeof input == 'boolean';
    },
    isFunction: function (input) {
        return typeof input == 'function';
    },
    isNull: function (input) {
        return input === undefined || input === null;
    },
    /**
     * 使用avue的表格时切换表头语言
     * 解决2个问题：1、语言切换无法实时切换表头语言，需要刷新才能显示；2、简化表头语言切换编码
     * @param vueObj
     * 传入为this
     * @param tableColumn
     * avue的表格列定义
     * @param prefix
     * 语言文件里表头语言配置的前缀，语言配置key与表格表头key需要保持一致
     */
    changeTableLanguage(vueObj, tableColumn, prefix) {
        let that = vueObj;
        that.option.column.forEach(col => {
            col.label = that.$t(prefix + col.prop);
        });
    },
	//搜索框动态切换中英文
	changeSearchLanguage(vueObj, searchModule, prefix , searchType) {
	    let that = vueObj;
		if (searchType=="btn") {
			searchModule.forEach(col => {
			    col.label = that.$t(prefix + col.search);
			});
		} else if (searchType==="condition") {
			searchModule.forEach(col => {
			    col.label = that.$t(prefix + col.search) + ':';
			});
		} else if (searchType==="placeholder") {
			searchModule.forEach(col => {
			    col.placeholder = that.$t(prefix + col.placeholderFiled);
			});
		}
	},
	//动态设置搜索框参数
	setSearchForm(searchForm , data , res){
		searchForm.forEach(col => {
			if (col.prop === data) {
				col.datas = res;
			}
		});
	},

	/**
	 * 获取地址栏Ticket
	 */
	getUrlTicket(){
		let ticket = getUrlStr("ticket")
		console.log(ticket)
		if (ticket) {
			return ticket.split("#")[0]
		}
		return undefined
	},

    /**
     * 使用按钮或其他非<a>标签，点击下载
     * @param url
     * 文件链接
     */
    downloadWithClick(url) {
        let link = document.createElement('a');
        link.style.display = 'none';
        link.href = url;
        link.setAttribute('download', this.fileName);
        document.body.appendChild(link);
        link.click();
    }
};
